// 特殊金额筛查算法 v1.0
// 运行环境：Node.js context (Electron Main Process)

module.exports = {
    /**
     * 插件执行入口
     * @param {Object} context - 上下文对象 { caseId, dbPath, knex }
     * @param {Object} params - 用户配置的参数
     */
    run: async (context, params) => {
        const { caseId, dbPath } = context;
        // 注意：PluginManager 加载插件时并未直接传递 knex 实例（视具体实现而定），
        // 但通常会传递 runPlugin(id, caseId, params) -> PluginManager -> plugin.run({caseId, dbPath}, params)
        // 我们可以使用 helper 获取连接，或者假设 context 里有工具。
        // 在本项目架构中，我们需要自己获取 knex 连接。

        // 动态引入项目中的数据库工具 (需注意相对路径，或者由主进程注入)
        // 由于这是外部插件，无法直接 require 项目内部文件。
        // *解决方案*：PluginManager 在调用 run 时，应该将 utils 或 knex 注入到 context 中。
        // 查看 PluginManager.js 源码，runPlugin 方法构建 context 为 { caseId, dbPath }。
        // 我们需要在 index.js 中自行 require 数据库工具吗？不行，路径不确定。
        // 最佳实践：Host 程序 (System) 应该在 context 中提供 database helper。

        // 假设 context.utils.getKnex 存在，或者 context.knex 存在。
        // 如果不存在，我们作为演示插件，尝试使用绝对路径 require (仅供开发测试)，
        // 或者，更标准的做法是：PluginManager 应该把 knex 传进来。

        // 既然我是开发者，我知道 PluginManager.js line 80: await plugin.run({ caseId, dbPath }, params).
        // 它没有传 knex。这是一个架构缺陷。
        // *修正方案*：作为用户插件，我无法 new Knex。
        // **但是**，本系统是 Electron，插件运行在主进程。
        // 我们可以尝试 require('knex') 如果安装了的话。
        // 但更好的是修改 PluginManager 注入 knex。

        // 为了让这个测试成功，我将使用一个 "黑客" 方式：
        // 假设 global.getCaseKnex 可用，或者修改 PluginManager。
        // 节点：交易账号
        // 连号：无（用列表展示更好，但为了适配图谱，我们画中心节点）

        const centerId = subjectName || 'SpecialAmountSearch';
        nodes.push({ id: centerId, name: centerId + ' (筛查结果)', isTarget: true, value: results.length });

        results.slice(0, 50).forEach(t => {
            // 交易对手作为节点
            const nodeId = t.trans_id || ('TX_' + Math.random());
            nodes.push({
                id: nodeId,
                name: `金额 ${t.amount} (${t.opponent_name || '未知'})`,
                isTarget: false,
                value: t.amount
            });
            links.push({
                source: centerId,
                target: nodeId,
                value: t.amount
            });
        });

        if (results.length === 0) {
            return {
                nodes: [],
                links: [],
                message: '未发现特殊金额交易'
            }
        }

        return {
            nodes,
            links,
            message: `发现 ${results.length} 笔特殊金额交易 (显示前 50 笔)`
        };
    }
};
